﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//using System.Diagnostics;
using Controller; // Brug vores class library "Controller"
using Interfaces; // Brug vores class library "Interfaces"

namespace Sorts_F1
{
    public partial class FrmAngivResultat : Form
    {
        // Attributter
        ClsSystemController systemController;
        List<int> koerenummerChekker;
        List<int> PlaceringsChekker;

        public FrmAngivResultat(ClsSystemController systemController) // Modtager controlleren fra start formen
        {
            InitializeComponent();
            this.systemController = systemController; // Istedet for at instansiere en ny controller bruger vi den der bliver sendt med
            this.MinimumSize = this.MaximumSize = this.Size; // Sørg for at formen altid er den nuværende størrelse
            koerenummerChekker = new List<int>();
            PlaceringsChekker = new List<int>();
        }

        private void FrmAngivResultat_Load(object sender, EventArgs e)
        {
            // Indlæs grandprixerne i comboboxen
            foreach (var item in systemController.VisGrandPrix())
            {
                cbGrandPrix.Items.Add(item.Land);
            }

            cbGrandPrix.SelectedIndex = 0; // Vis det første element i comboboxen

            // Indlæs kørerne i det ene listview
            foreach (var item in systemController.VisKoerere())
            {
                ListViewItem lvi = new ListViewItem();
                lvi.SubItems[0].Text = item.Navn;
                lvi.SubItems.Add(item.KoereNummer.ToString());
                lvKoerere.Items.Add(lvi);
            }
        }

        private void btnTildelPlacering_Click(object sender, EventArgs e)
        {
            try
            {
                int placering = int.Parse(txtPlacering.Text);

                lvPlacering.Columns[0].ListView.Sorting = SortOrder.Ascending; // Sorter første colonne (0) alfabetisk 
                bool eksiternekoerer = false;

                // dobbelt løkke. Tidskomplexitet: O n^2 
                for (int i = 0; i < koerenummerChekker.Count; i++)
                {
                    for (int tæller = 0; tæller < PlaceringsChekker.Count; tæller++)
                    {
                        // Hvis enten den valgte kørers kørernummer eller placering allerede er adderet til listen, så kan man ikke gøre det igen.
                        if (int.Parse(lvKoerere.FocusedItem.SubItems[1].Text) == koerenummerChekker[i] || placering == PlaceringsChekker[tæller])
                        {
                            MessageBox.Show("Placering eller køreren er allerede angivet på listen");
                            eksiternekoerer = true;
                        }
                        else
                        {
                            eksiternekoerer = false;
                        }
                    }

                }

                if (eksiternekoerer == false)
                {
                    if (placering > 0 && placering < 11)
                    {
                        ListViewItem lvi = new ListViewItem(); // Instansier listview

                        // Hvis placering er mindre end 10, så bliver 0 tilføjet foran tallet i en skjult colonne
                        // dette er en hurtig og effektiv måde at sorterer colonnen på. En anden måde ville være, at oprette en listview IComparer class.

                        if (int.Parse(txtPlacering.Text) < 10)
                        {
                            lvi.SubItems[0].Text = "0" + txtPlacering.Text; // hvis placering fx er 7, bliver det til 07 (i den skjulte colonne).
                        }

                        else
                        {
                            lvi.SubItems[0].Text = txtPlacering.Text;
                        }

                        lvi.SubItems.Add(txtPlacering.Text);
                        lvi.SubItems.Add(lvKoerere.FocusedItem.SubItems[0].Text); // Det valgte item på listviewet lvKoerere første colonne
                        lvi.SubItems.Add(lvKoerere.FocusedItem.SubItems[1].Text); // Det valgte item på listviewet lvKoerere anden colonne

                        koerenummerChekker.Add(int.Parse(lvKoerere.FocusedItem.SubItems[1].Text));
                        PlaceringsChekker.Add(int.Parse(txtPlacering.Text));

                        lvPlacering.Items.Add(lvi); // Addere subitems til listviewet
                    }

                    else
                    {
                        MessageBox.Show("Kun placeringer fra 1-10 kan tildeles");
                    }
                }
            }

            catch
            {
                MessageBox.Show("Der kan ikke være mere end 10 placeringer");
            }
        }

        private void btnTilbage_Click(object sender, EventArgs e)
        {
            this.Close(); // Lukker formen
        }

        private void btnRydListen_Click(object sender, EventArgs e)
        {
            // Resetter listview og lister
            lvPlacering.Items.Clear();
            koerenummerChekker.Clear();
            PlaceringsChekker.Clear();
            MessageBox.Show("Listen er rydet");
        }

        private void btnGemPlacering_Click(object sender, EventArgs e)
        {
            try
            {
                // Se om der skal tildeles hele eller havle point til Grand Prixet
                if (cBoxHalvePoint.Checked == false)
                {
                    IClsGrandPrix grandPrix = null;

                    // Find det Grand Prix der passer til teksten(landet) i comboboxen
                    foreach (var item in systemController.VisGrandPrix())
                    {
                        if (item.Land == cbGrandPrix.Text)
                        {
                            grandPrix = item;
                        }
                    }

                    // For hvert objekt der ligger i listviewet lvPlacering uploades dette objekt til databsen
                    for (int i = 0; i < lvPlacering.Items.Count; i++)
                    {
                        // Upload resultatet til datasen                                 (Kørenummer)                                      (placering)
                        systemController.UploadPlaceringTilDB(grandPrix.GrandPrixNummer, int.Parse(lvPlacering.Items[i].SubItems[3].Text), int.Parse(lvPlacering.Items[i].SubItems[1].Text));
                    }

                    // Metoden bruges udlukkende til at ændre GrandPrixet tilstand til afviklet = true
                    systemController.RedigerGrandPrixIDB(grandPrix.GrandPrixNummer, grandPrix.Land, grandPrix.BaneNavn, grandPrix.GrandPrixDatoTid, true, grandPrix.Joker.KoereNummer, grandPrix.AutoSatsKoere1, grandPrix.AutoSatsKoere2);

                    MessageBox.Show("Resultatet er opgivet.");

                    // Når resusltatet er angivet resettes listviewet
                    lvPlacering.Items.Clear();
                }

                // Hvis der skal tildeles havle point
                else
                {
                    IClsGrandPrix grandPrix = null;

                    // Find det Grand Prix der passer til teksten(landet) i comboboxen
                    foreach (var item in systemController.VisGrandPrix())
                    {
                        if (item.Land == cbGrandPrix.Text)
                        {
                            grandPrix = item;
                        }
                    }

                    // For hvert objekt der ligger i listviewet lvPlacering uploades dette objekt til databsen
                    for (int i = 0; i < lvPlacering.Items.Count; i++)
                    {
                        //Denne metode opretter kørene med de halve point, i databasen ligger de halve point under placering 100
                        systemController.UploadPlaceringTilDB(grandPrix.GrandPrixNummer, int.Parse(lvPlacering.Items[i].SubItems[2].Text), 100 + int.Parse(lvPlacering.Items[i].SubItems[0].Text));
                    }

                    MessageBox.Show("Resultatet er opgivet. med halve point");
                }
            }

            catch
            {
                MessageBox.Show("Fejl ved upload af resultater");
            }
        }

        // Når et (andet) Grand Prix vælges, skal listviewet cleares
        private void cbGrandPrix_SelectedIndexChanged(object sender, EventArgs e)
        {
            lvPlacering.Items.Clear();
            koerenummerChekker.Clear();
            PlaceringsChekker.Clear();
        }
    }
}
